package com.future;

import java.util.Arrays;

/**
 * Description:
 * 包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ，
 * 平均灰度的计算是周围的8个单元和它本身的值求平均，如果周围的单元格不足八个，则尽可能多的利用它们。
 * <p>
 * 示例 1:
 * <p>
 * 输入:
 * [[1,1,1],
 * [1,0,1],
 * [1,1,1]]
 * 输出:
 * [[0, 0, 0],
 * [0, 0, 0],
 * [0, 0, 0]]
 * 解释:
 * 对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
 * 对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
 * 对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
 * 注意:
 * <p>
 * 给定矩阵中的整数范围为 [0, 255]。
 * 矩阵的长和宽的范围均为 [1, 150]。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/image-smoother
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/9/26 15:53
 */
public class Solution_imageSmoother_661 {

    public static void main(String[] args) {
        int[][] img = new int[][]{{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
        img = imageSmoother(img);
        System.out.println(Arrays.toString(img));
    }

    /**
     * 输入:
     * [[1,1,1],
     * [1,0,1],
     * [1,1,1]]
     * 步骤：
     * （1）点 00= (00+01+10+11)/4
     * （2）点 01= (00+01+02+10+11+12)/4
     * （3）点 11= (00+01+02+10+11+12+20+21+22)/4
     *
     * @param img 注意：img.length获取点的是行数，不是列数
     * @return
     */
    public static int[][] imageSmoother(int[][] img) {
        if (img == null) {
            return img;
        }
        int rowNum = img.length; //行 纵向
        int columNum = img[0].length; //列 横向
        int[][] result = new int[rowNum][columNum];
        for (int i = 0; i < rowNum; i++) {
            for (int j = 0; j < columNum; j++) {
                result[i][j] = buildCurrentCoordinate(i, j, img, rowNum, columNum);
            }
        }
        return result;
    }

    /**
     * 节点(rowIndex,columIndex)的计算结果
     * <p>
     * 假设求(1,1)
     * 则11=
     * 00+01+02
     * 10+11+12
     * 20+21+22
     *
     * @param rowIndex
     * @param columIndex
     * @param img
     * @return
     */
    private static int buildCurrentCoordinate(int rowIndex, int columIndex, int[][] img, int maxRow, int maxColum) {
        int result;
        int count = 1;
        // 当前坐标值
        result = img[rowIndex][columIndex];
        // 当前坐标的上一行（行数-1）
        if (rowIndex - 1 >= 0) {
            // 正上方一个
            result += img[rowIndex - 1][columIndex];
            if (columIndex - 1 >= 0) {
                // 左上方
                result += img[rowIndex - 1][columIndex - 1];
                count++;
            }
            // 右上方
            if (columIndex + 1 < maxColum) {
                result += img[rowIndex - 1][columIndex + 1];
                count++;
            }
            count++;
        }
        // 当前坐标一行(行数不变)
        if (columIndex - 1 >= 0) {
            // 左一
            result += img[rowIndex][columIndex - 1];
            count++;
        }
        // 右一
        if (columIndex + 1 < maxColum) {
            result += img[rowIndex][columIndex + 1];
            count++;
        }
        // 当前坐标下一行(行数+1)
        if (rowIndex + 1 < maxRow) {
            if (columIndex - 1 >= 0) {
                // 左下角
                result += img[rowIndex + 1][columIndex - 1];
                count++;
            }
            // 正下方
            result += img[rowIndex + 1][columIndex];
            if (columIndex + 1 < maxColum) {
                // 右下角
                result += img[rowIndex + 1][columIndex + 1];
                count++;
            }
            count++;
        }
        return result / count;
    }
}
